
#include "ArbolArrayConPtrPadre.h"

ArbolArrayConPtrPadre::ArbolArrayConPtrPadre(){

}
ArbolArrayConPtrPadre::~ArbolArrayConPtrPadre(){
    delete []estructuraDatos;
}
void ArbolArrayConPtrPadre::crear(){
	ultimoLleno = 0;
	numElem = 0;
}
void ArbolArrayConPtrPadre::vaciar(){
	ultimoLleno = 0;
	numElem = 0;
}
int ArbolArrayConPtrPadre::vacio(){
	return !numElem;
}

void ArbolArrayConPtrPadre::agregarHijo(char nEtiqueta, int nPadre,int ubicacion){
    ultimoLleno++;
    char pba=nEtiqueta;
    int padreQueBusco=nPadre;
    int pSiguiente;
    char eSiguiente;
    ubicacion--;
    for(int i = nPadre+1;i<ultimoLleno+1;i++){
        if(ubicacion==0){
        pSiguiente=estructuraDatos[i].padre;
        eSiguiente=estructuraDatos[i].etiqueta;
        estructuraDatos[i].padre=nPadre;
        estructuraDatos[i].etiqueta=nEtiqueta;
        i++;
        nPadre=estructuraDatos[i].padre;
        nEtiqueta=estructuraDatos[i].etiqueta;
        estructuraDatos[i].padre=pSiguiente;
        estructuraDatos[i].etiqueta=eSiguiente;
        }
        else{
            if(estructuraDatos[i].padre==padreQueBusco){
                ubicacion--;
            }
        }
    }

}
void ArbolArrayConPtrPadre::borrar(int nodo){
    ultimoLleno--;
	for(int i = nodo;i<ultimoLleno;i++){
		estructuraDatos[i].etiqueta=estructuraDatos[i+1].etiqueta;
		if(estructuraDatos[i].padre>i){
			estructuraDatos[i].padre=estructuraDatos[i+1].padre-1;
		}
		else{
			estructuraDatos[i].padre=estructuraDatos[i+1].padre;
		}
	}
}
int ArbolArrayConPtrPadre::numNodos(){
	return numElem;
}
int ArbolArrayConPtrPadre::numHijos(int nodo){
	int numHijos=0;
	for(int i = 0;i<=ultimoLleno;i++){
		if(estructuraDatos[i].padre==nodo){
		numHijos++;
		}
	}
	return numHijos;
}
int ArbolArrayConPtrPadre::raiz(){
	return 0;
}
void ArbolArrayConPtrPadre::ponerRaiz(char nEtiqueta){
	numElem=1;
	estructuraDatos[0].etiqueta=nEtiqueta;
	estructuraDatos[0].padre=-1;
}
int ArbolArrayConPtrPadre::padre(int nodo){
	return estructuraDatos[nodo].padre;
}
int ArbolArrayConPtrPadre::hijoMasIzq(int nodo){
    int HMI=-1;
    while(HMI!=nodo){
        nodo++;
        HMI=estructuraDatos[nodo].padre;
    }
    return HMI;
}
int ArbolArrayConPtrPadre::hermanoDer(int nodo){
    int HD=nodo+1;
    while(estructuraDatos[nodo].padre!=estructuraDatos[HD].padre){
        HD++;
    }
    return HD;
}
char ArbolArrayConPtrPadre::recuperar(int nodo){
	return estructuraDatos[nodo].etiqueta;
}
void ArbolArrayConPtrPadre::modificarEtiqueta(char nEtiqueta,int nodo){
	estructuraDatos[nodo].etiqueta=nEtiqueta;
}
void ArbolArrayConPtrPadre::imprimir(){
    cout<<ultimoLleno<<endl;
	for(int i=0;i<=ultimoLleno;i++){
		cout<<i<<"       "<<estructuraDatos[i].etiqueta<<"  "<<estructuraDatos[i].padre<<endl;
	}
}


